package MobileCommServer;

import java.io.IOException;
import java.net.*;
import java.util.*;

/**
 * <pre>
 * @Package : MobileCommServer
 * @File    : MobileCommServer.java
 * <pre>
 *
 * @Author  : 차재우
 * @Date    : 2013. 7. 24.
 * @Version :
 */
public class MobileCommServer {
	// INI 파싱 객체
	private ConfigManager configManager = null;
	
	// 클라이언트 소켓 관리 해쉬
	private HashMap<Integer, ClientThread> clients = null;
	
	// 클라이언트 소켓
	private Socket socket = null;
	
	// 시리얼 통신 포트
	private SerialComm serialComm = null;
	
	// 시리얼 송신 대기 큐
	private SerialQueue sendQueue = new SerialQueue();
	
	// 시리얼 수신 대기 큐
	private SerialQueue recvQueue = new SerialQueue();

	/**
	 * <pre>
	 * @Comment : 생성자
	 * <pre>
	 *
	 */
	public MobileCommServer() {
		clients = new HashMap<Integer, ClientThread>();
		Collections.synchronizedMap(clients);
	}

	/**
	 * <pre>
	 * @Comment : main 함수
	 * <pre>
	 *
	 * @Method  : main
	 * @param args
	 */
	public static void main(String[] args) {
		new MobileCommServer().ServerStart();
	}

	/**
	 * <pre>
	 * @Comment : 서버 시작 함수
	 * <pre>
	 *
	 * @Method  : ServerStart
	 */
	public void ServerStart() {
		System.out.println("**************************** MobileCommServer start ****************************");

		// 환경설정 파일 불러오기
		configManager = new ConfigManager();
		String serialPort = configManager.getSerialPort();
		int serverPort = configManager.getServerPort();
		System.out.println(configManager.toString());
		
		ServerSocket serverSocket = null;

		try {
			// 서버 소켓 생성
			serverSocket = new ServerSocket(serverPort);
			
			// 시리얼 포트 생성
			this.serialComm = new SerialComm(serialPort, recvQueue, sendQueue);
			
			// Recv queue 관리 스레드
			Thread sender = new Thread(new SenderThread(this));
			sender.start();

			while (true) {
				socket = serverSocket.accept();
				
				// 클라이언트 스레드 
				Thread clientThread = new Thread(new ClientThread(this));

				System.out.println(socket + "   Socket hash code : " + socket.hashCode());
				System.out.println("=================================================================================\n");

				clientThread.start();
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @return the clients
	 */
	public HashMap<Integer, ClientThread> getClients() {
		return clients;
	}

	/**
	 * @return the socket
	 */
	public Socket getSocket() {
		return socket;
	}

	/**
	 * @return the sendQueue
	 */
	public SerialQueue getSendQueue() {
		return sendQueue;
	}

	/**
	 * @return the recvQueue
	 */
	public SerialQueue getRecvQueue() {
		return recvQueue;
	}
}
